<?php

/**
 * Получить id группы или создать новую
 */
function access_save_groupcode($code,$mod,$name=null)
{
    $id = access_get_groupid($code,$mod);
    if (!$id)
    {
        if (is_null($name)){$name=$code;}
        $id = access_add_group($name,$code,$mod);
    }
    return $id;
}

/**
 * Записать пользователя в группу
 */
function access_save_user2groupid($usr_id,$group_id)
{
    $Processor = mst_getdatemod('access','Processor');
    $obj = $Processor->query('sc_getObj_groupmemb');    
    $obj->set('plain',$usr_id,'usr_id');
    $obj->set('plain',$group_id,'group_id');

    $id = $Processor->query('saveUser2Group',$obj);
    if (!$id OR sharpobj_iserror($id ))
    {
        // Ошибка
        mst_error('Ошибка sharpobj',"Процессор вернул ошибку {$id->get('plain','code')} {$id->get('plain','name')} {$id->get('plain','about')}",1);
        return false;
    }
    return true;
}

/**
 * Получить id или создать роль
 */
function access_save_role($code,$mod,$name=null)
{
    $Processor = mst_getdatemod('access','Processor');
    $obj = $Processor->query('sc_getObj_roles');
    $obj->set('plain',$mod,'mod');
    $obj->set('plain',$code,'code');    
    $obj->set('plain',$name,'name');
    $id = $Processor->query('saveRole',$obj);
    if (!$id)
    {
        mst_error('Ошибка sharpobj',"Процессор не создал роль {$name} ({$code}:{$mod}) или не вернул ее id ",1);
        return false; 
    }
    if (sharpobj_iserror($id ))
    {
        // Ошибка
        mst_error('Ошибка sharpobj',"Процессор вернул ошибку {$id->get('plain','code')} {$id->get('plain','name')} {$id->get('plain','about')}",1);
        return false;
    }
    return $id;
}
/**
 * Добавить пользователя в роль
 */
function access_save_user2roleid($usr_id,$role_id,$order=0)
{
    $Processor = mst_getdatemod('access','Processor');
    $obj = $Processor->query('sc_getObj_rolememb');    
    $obj->set('plain',$usr_id,'usr_id');
    $obj->set('plain',$role_id,'role_id');
    $obj->set('plain',$order,'order');

    $id = $Processor->query('saveUser2RoleId',$obj);
    if (!$id OR sharpobj_iserror($id ))
    {
        // Ошибка
        mst_error('Ошибка sharpobj',"Процессор вернул ошибку {$id->get('plain','code')} {$id->get('plain','name')} {$id->get('plain','about')}",1);
        return false;
    }
    return true;
}
/**
 * Добавить пользователя в роль
 */
function access_save_user2role($usr_id,$role_code,$name=null,$order=0)
{
    $role_id = access_save_role($role_code,'access',$name);
    return access_save_user2roleid($usr_id,$role_id,$order);
}

// Присвоить право группе
// Присвоить право пользователю

/**
 * Задать права доступа для элемента
 */
function access_save_permission2item($subj_type,$subj_id,$item_type,$item_id,$permissions)
{
    $Processor = mst_getdatemod('access','Processor');
    $obj = $Processor->query('sc_getObj_permissions');    
    $obj->set('plain',$subj_type,'subj_type');
    $obj->set('plain',$subj_id,'subj_id');
    $obj->set('plain',$item_type,'item_type');
    $obj->set('plain',$item_id,'item_id');
    
    // Устанавливаем права доступа в объекте
    $all_permissions = access_const_permissions();
    foreach ($all_permissions as $perm_name)
    {
        if (isset($permissions[$perm_name]) and $permissions[$perm_name])
        {
            $obj->setP(1,$perm_name);
        }else{
            $obj->setP(0,$perm_name);
        }
    }

    $id = $Processor->query('savePermission',$obj);
    if (!$id OR sharpobj_iserror($id ))
    {
        // Ошибка
        mst_error('Ошибка sharpobj',"Процессор вернул ошибку {$id->get('plain','code')} {$id->get('plain','name')} {$id->get('plain','about')}",1);
        return false;
    }
    return $id;
}
/**
 * Задать права доступа к именованному объекту для группы
 */
function access_save_permission4group2nameobj($group_id_OR_code,$mod,$code,$permissions)
{
    if (is_string($group_id_OR_code))
    {    // Вместо id группы нам передали код:модуль, который нужно преобразовать
        
        if (strpos($group_id_OR_code,':')!==false)
        {
            $group_cm = explode(':',$group_id_OR_code);
            if (strlen($group_cm[1])==0){$group_cm[1]=null;}
        }else
        {
            $group_cm[0]=$group_id_OR_code;
            $group_cm[1]=$mod;
        }
        $group_id = access_save_groupcode($group_cm[0],$group_cm[1]);
    }
    return access_save_permission2nameobj('group',$group_id,$mod,$code,$permissions);
}

/**
 * Задать права доступа к именованному объекту для пользователя
 */
function access_save_permission4user2nameobj($usr_id,$mod,$code,$permissions)
{
    return access_save_permission2nameobj('user',$usr_id,$mod,$code,$permissions);
}
/**
 * Задать права доступа для именованного объекта
 */
function access_save_permission2nameobj($subj_type,$subj_id,$mod,$code,$permissions)
{
    $Processor = mst_getdatemod('access','Processor');
   
    $obj = $Processor->query('sc_getObj_permissions');
	
    $obj->set('plain',$subj_type,'subj_type');
    $obj->set('plain',$subj_id,'subj_id');
    $obj->set('plain','obj_named','item_type');
    $obj->set('plain',access_save_namedobj($mod,$code),'item_id');
    
    // Устанавливаем права доступа в объекте
    $all_permissions = access_const_permissions();
    foreach ($all_permissions as $perm_name)
    {
        // Разрешить или запретить?
        if (isset($permissions[$perm_name]) and $permissions[$perm_name])
        {
            $obj->setP(1,$perm_name);
        }else{
            $obj->setP(0,$perm_name);
        }
    }

    $id = $Processor->query('savePermission',$obj);
    if (!$id OR sharpobj_iserror($id ))
    {
        // Ошибка
        mst_error('Ошибка sharpobj',"Процессор вернул ошибку {$id->get('plain','code')} {$id->get('plain','name')} {$id->get('plain','about')}",1);
        return false;
    }
    return $id;
}


/**
 * Создать именованный объект
 */
function access_save_namedobj($mod,$code)
{
    $Processor = mst_getdatemod('access','Processor');
    $obj = $Processor->query('sc_getObj_objnames');
    $obj->set('plain',$mod,'mod');
    $obj->set('plain',$code,'code');
    $id = $Processor->query('saveNamedItem',$obj);
    if (!$id OR sharpobj_iserror($id ))
    {
        // Ошибка
        mst_error('Ошибка sharpobj',"Процессор вернул ошибку {$id->get('plain','code')} {$id->get('plain','name')} {$id->get('plain','about')}",1);
        return false;
    }
    return $id;
}

?>